package com.zs.test;

import com.zs.pojo.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * @author ZhouShuang
 * @version 17
 * @Title
 * @date 2025/6/7 下午7:40
 */
public class GetClassAllInfo {
    public static void main(String[] args) {
        //获取Class的实例
        Class<?> clzz = Person.class;
        String fullName = clzz.getName();
        String simpleName = clzz.getSimpleName();
        System.out.println("===========以下是" + fullName + "的元信息===========");

        //获取Person类所在的包名
        Package pkg = clzz.getPackage();
        System.out.println(simpleName + "定义在" + pkg.getName() + "包中");

        //获取Person类的修饰符
        int modifier = clzz.getModifiers();
        System.out.println("这个类的修饰符是" + Modifier.toString(modifier));

        //获取Person类的继承关系
        Class<?>  superClass = clzz.getSuperclass();
        System.out.println(simpleName + "的父类是"+ superClass.getName());

        //获取Person实现的接口数组
        Class<?> [] interfaces = clzz.getInterfaces();
        if(interfaces.length == 0){
            System.out.println(simpleName + "没有实现接口");
        }else{
            System.out.print(simpleName + "所实现的接口有");
            for (Class<?> aClass : interfaces) {
                System.out.println("\t" + aClass.getName());
            }
        }

        //获取Person类的构造函数
        Constructor <?> [] constructors = clzz.getDeclaredConstructors();
        System.out.println("----------------------构造函数的基本信息-------------------------");
        for (Constructor<?> constructor : constructors) {
            int constructorModifier = constructor.getModifiers();
            System.out.println("访问修饰符：");
            System.out.println(Modifier.toString(constructorModifier));

            //获取构造方法的参数列表
            Class<?> [] params = constructor.getParameterTypes();
            if(params.length == 0 ){
                System.out.println("该构造函数没有参数");
            }else{
                System.out.print("该构造函数的参数列表为：[");
                for (Class<?> param : params) {
                    System.out.print(param.getName()+" ");
                }
                System.out.println("]");
            }
            System.out.println("--------------------------------------------------------");
        }

        //获取Person类的属性
        Field [] fields = clzz.getDeclaredFields();
        System.out.println("-----------------------------Person类属性基本信息----------------------------------");
        for (Field field : fields) {
            System.out.println("属性名："+field.getName());
            System.out.println("属性类型："+field.getType().getName());
            System.out.println("属性的修饰符："+Modifier.toString(field.getModifiers()));
            System.out.println("-----------------------------------------------------------------------------------");
        }

        //获取Person类的方法
        Method [] methods = clzz.getDeclaredMethods();
        System.out.println("----------------------------------Person类方法的基本信息-----------------------------------------");
        for (Method method : methods) {
            System.out.println("方法名称"+method.getName());
            System.out.println("方法的返回值类型："+method.getReturnType());
            //获取此方法的参数列表
            Class<?> [] params = method.getParameterTypes();
            if(params.length == 0){
                System.out.println("该方法没有参数");
            }else{
                System.out.print("该方法的参数列表为：[");
                for (Class<?> param : params) {
                    System.out.print(param.getName());
                }
                System.out.println("]");
            }
            //获取方法的修饰符
            System.out.println("方法的修饰符："+Modifier.toString(method.getModifiers()));
            //获取方法所定义在的类
            Class<?> clazz = method.getDeclaringClass();
            System.out.println("该方法定义在"+clazz.getName()+"类中");

            //获取方法所抛出的异常
            Class<?> [] exceptions = method.getExceptionTypes();
            if(exceptions.length == 0) {
                System.out.println("该方法没有抛出异常");
            }else{
                System.out.print("该方法抛出的异常为：[");
                for (Class<?> exception : exceptions) {
                    System.out.print(exception.getName()+" ");
                }
                System.out.println("]");
            }
            System.out.println("------------------------------------------------");
        }
    }
}
